php.ini 文件配置

        前面已经拷贝了一个 php.ini 文件到 /usr/local/php/etc 目录下面,这是已经知道 php.ini 所在路径在哪里,但有时候并不知道 php.ini 所在路径,这时候就需要命令来查一查在哪里

1
[root@lamp ~]# /usr/local/php/bin/php -i |head

        看那一行 Loaded Configuration File => /usr/local/php/etc/php.ini 。如果这里为 None ,那么就说明没有加载到具体的 php.ini 。找到 php.ini 后,名 vim 打开它,发现很多行都是以 ; 开头的,这个符号在 php.ini 中作为注释符号,也就是说只要是以 ; 开头的行都是不起作用的。而php.ini 中常用的配置有如下:

1.配置 disable_function

        默认是没有配置的

        disable_functions = eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close

        说明,在 php 中有非常多的函数,在这些函数中有一些是不太安全的,所以有必要把它们禁掉。像 exec ,shell_exec 都是在 php 代码中执行 linux shell 命令,很危险,要禁掉。

2.配置 error_log

        如果是 php 开发人员,那会经常遇到调试代码的情况,作为一个运维人员理应学会简单的 php 错误排查技能,其实 php 的错误跟 linux 下其他服务都是一样的,遇到错误后要查看错误日志,根据报错信息来判断错误的原因。那如何查看 php 的错误信息?遇到错误时,访问网站通常会显示白页,什么都没有,状态码是500.第一种情况,可以直接把错误信息显示在浏览器中,配置方法是在 php.ini 中找到 display_errors = on 。重启 apache 服务后,刷新页面,发现不再是白页,而是具体的错误。这样就可以根据错误来调试 php 代码了。这种情况适合临时调试,但是这种情况不适合长期配置,因为所有错误都会显示在浏览器上,假如哪天 php 程序员不小心写错一段代码,而且没有测试直接上传到服务器上了,那么用户就会直接看到这些错误,这样是不合适的。所以还有第二种情况,把错误信息输出到一个日志文件中,具体配置如下:

1
[root@lamp ~]# vim /usr/local/php/etc/php.ini

        加入或更改

1
2
3
display_error=off
log_errors=on
error_log=/usr/local/php/logs/php_errors.log

        说明:该文件一开始是不存在的,为了避免权限问题不能自动生成该文件,我们可以先创建该文件,并且修改权限为777

1
2
[root@lamp ~]# mkdir /usr/local/php/logs
[root@lamp ~]# chmod 777 /usr/local/php/logs
1
error_reporting = E_ALL & ~E_NOTICE

        说明:首先要把错误不再浏览器显示,第二打开错误日志开关,然后指定错误日志的了路径,最后是定义错误日志的级别。配置完成后要重启 apache 服务,才会生效。

3.配置 open_basedir

        在 php 中是有这个 open_basedir 概念的,它的意思是,把执行 php 的用户限定在指定的路径下,这样通过权限缩小的方式达到安全目的。作为一个网站,其实只需要让 php 用户访问到网站的代码即可,没有必要让它去访问其他目录。

1
[root@lamp ~]# vim /usr/local/php/etc/php.ini

        加入或更改

1
open_basedir = /data/www:/tmp

        说明:/data/www 和 /tmp 是允许 php 可以访问的两个目录,同样也可以是多个,目录之间用 : 分隔。一旦限定后,如果 php 试图去访问除 /data/www 和 /tmp 外的目录下的文件时,就会报错。错误类似于,Warning: file_exists() [function.file-exists]: open_basedir restriction in effect . File(../123.php) is not within the allowed path(s):

        除了在 php.ini 中定义 open_basedir 外,其实还可以在 apache 的配置文件中定义,因为一个 apache 下可能有多个站点,针对不同的站点限定不同的 open_basedir 。

1
[root@lamp ~]# vim /usr/local/apache2/conf/httpd.conf

        或者虚拟主机配置文件

1
[root@lamp ~]# vim /usr/local/apache2/conf/extra/httpd-vhosts.conf

        加入

1
php_admin_value open_basedir "/data/www/:/tmp/"